/**
 * axios封装
 * 请求拦截、响应拦截、错误统一处理
 */
import axios from 'axios';
import router from '../router.js';
import store from '../store.js';

import {
	Toast
} from 'vant'

/**
 * 提示函数
 * 禁止点击蒙层、显示一秒后关闭
 */
const tip = msg => {
	Toast({
		message: msg,
		duration: 1000,
		forbidClick: true
	})
}

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
	// 状态码判断
	switch (status) {
		// 404请求不存在
		case 404:
			router.replace({
				path: '/404'
			})
			break
		default:
			tip(other)
	}
}

axios.defaults.withCredentials = false;

// 创建axios实例
var instance = axios.create({
	timeout: 1000 * 12
})

// 设置post请求头
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
	config => {
		// 登录流程控制中，根据本地是否存在token判断用户的登录情况
		// 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
		// 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
		// 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
		const token = store.state.token
		token && (config.headers.Authorization = token)

		// store.commit('showLoading')

		return config
	},
	error => Promise.error(error))

// 响应拦截器
instance.interceptors.response.use(
	// 请求成功
	res => {
		return res.status === 200 ? Promise.resolve(res) : Promise.reject(res)
	},
	// 请求失败
	error => {
		const {
			response
		} = error

		// store.commit('hideLoading')

		if (response) {
			// 请求已发出，但是不在2xx的范围
			errorHandle(response.status, response.data.message)
			return Promise.reject(response)
		} else {
			tip('网络请求失败。')
		}
	})


const host = 'http://120.55.74.147:8081/web/apiservice';

function post(url, data, callback) {
	url = host + url;
	axios.post(url, data)
		.then(res => {
			console.log('status', res.data.status);
			if (res.data.status == 1) {
				callback(res.data.data)
			} else {
				tip(res.data.msg)
			}
		})
		.catch((err) => {
			tip('失败，请重试')
			console.log(err)
		});
}

function upLoad(url, fromData, callback) {
	url = host + url;
	axios.post(url, fromData, {
			'Content-Type': 'multipart/form-data',
		})
		.then(res => {
			console.log('status', res.data.status);
			//status无法判断是否成功，然后通过fileName是否为空字符串判断
			if (res.data.data && res.data.data.fileName) {
				callback(res.data.data)
			} else {
				tip('失败，请重试')
			}
		})
		.catch((err) => {
			tip('失败，请重试')
			console.log(err)
		});
}


export default {
	post,
	upLoad
};

export {
	post
}

export {
	upLoad
}
